package com.gxa.pingan.filter;

import com.gxa.pingan.common.ExceptionCode;
import com.gxa.pingan.common.JsonResult;
import com.gxa.pingan.exception.BusinessException;
import com.gxa.pingan.utils.ResponseUtil;
import com.gxa.pingan.utils.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 这是过滤权限的过滤器
 *
 * @author YXQ
 * @date 2021/11/3 8:04
 */
@WebFilter(filterName = "AuthFilter"/*,urlPatterns = "/*"*/)
public class AuthFilter implements Filter{
    @Override
    public void init(FilterConfig config) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // 1.通过URI判断servlet是否可以直接放行
        // 2.获取请求头中的type参数，如果是登录,注册,注销,发短信,导出操作时，直接放行
        HttpServletRequest request1 = (HttpServletRequest) request;
        // 对导出给予特殊的关爱
        String requestUri = request1.getRequestURI();
        // 从请求头中获取type
        String type = request1.getHeader("type");
        // 前期的提示消息
        System.out.println("-->欸！请求" + requestUri + "被拦截啦");
        // 如果被拦截给前端的给出提示信息
        JsonResult jsonResult = new JsonResult();
        // 获取session
        HttpSession session = request1.getSession();
        // 单独处理对优惠券的导出--通过requestURI来处理
        // 方法1.全字符串匹配，方法2.endsWith(字符串是否以指定的后缀结束)
        // String couponExport = "/couponExport";
        // String userExport = "/userExport";
        // 指定后缀为Export
        // 如果有大小写的不同，可以通过1.全部转化为小写toLowerCase2.忽略大小写的匹配equalsIgnoreCase
        String suffix = "Export";
        if (requestUri.endsWith(suffix)){
            // 放行--对导出给予特殊的关爱
            chain.doFilter(request, response);
            // 提示信息
            System.out.println("-->嘿！我又放行啦");
        }
        // 判断type参数的类型
        if (!StringUtils.isEmpty(type)) {
            // 如果是登录,注册,发短信,登出操作时，直接放行
            String reg = "reg";
            String login = "login";
            String getSms = "getSms";
            String logout = "logout";
            if (reg.equals(type) || login.equals(type) || getSms.equals(type) || logout.equals(type)) {
                // 放行
                chain.doFilter(request, response);
                // 提示信息
                System.out.println("-->嘿！我被放行啦");
                // 除开上述业务之外的验证token
            }else {
                // 从请求头获取token
                String token = request1.getHeader("token");
                // 从session中获取保存的token
                String token1 = (String) session.getAttribute("token");
                // 先判断token是否为空,再判断token是否一致，如果一致则放行
                if (!StringUtils.isEmpty(token1) && !StringUtils.isEmpty(token) && token1.equals(token)) {
                    // 放行
                    chain.doFilter(request, response);
                    // 提示信息
                    System.out.println("验证token完毕-->嘿！我被放行啦");
                } else {
                    // 自定义的异常
                    BusinessException businessException = new BusinessException(ExceptionCode.WRONG_TOKEN);
                    // 通过session对象传递异常
                    session.setAttribute("exception", businessException);
                    // 把错误信息传递给前端
                    jsonResult.setCode(ExceptionCode.WRONG_TOKEN.getCode().toString());
                    jsonResult.setMsg(ExceptionCode.WRONG_TOKEN.getMessage());
                    // 传递给前端
                    ResponseUtil.write((HttpServletResponse) response, jsonResult.getDataMap());
                    // 转发给异常处理器
                    request1.getServletContext().getRequestDispatcher("/error").forward(request, response);
                }
            }
        } else {
            // 自定义的异常
            BusinessException businessException = new BusinessException(ExceptionCode.RESPONSE_FALSE);
            // 通过session对象传递异常
            session.setAttribute("exception", businessException);
            // 给前端传递错误信息
            jsonResult.setCode(ExceptionCode.RESPONSE_FALSE.getCode().toString());
            jsonResult.setMsg(ExceptionCode.RESPONSE_FALSE.getMessage());
            // 传递给前端
            ResponseUtil.write((HttpServletResponse) response, jsonResult.getDataMap());
            // 转发给异常处理器
            request1.getServletContext().getRequestDispatcher("/error").forward(request, response);
        }
    }
}
